1 /*
2  * Hunt - a framework for web and console application based on Collie using Dlang development
3  *
4  * Copyright (C) 2015-2017  Shanghai Putao Technology Co., Ltd
5  *
6  * Developer: HuntLabs
7  *
8  * Licensed under the Apache-2.0 License.
9  *
10  */
11  
12 module hunt.utils..string;
13 
14 import std.datetime;
15 import std.conv;
16 import std.string;
17 import std.array;
18 import std.path;
19 
20 pragma(inline)
21 string printDate(DateTime date)
22 {
23     return format("%.3s, %02d %.3s %d %02d:%02d:%02d GMT", // could be UTC too
24         to!string(date.dayOfWeek).capitalize, date.day, to!string(date.month)
25         .capitalize, date.year, date.hour, date.minute, date.second);
26 }
27 
28 /// convert time to RFC822 format string
29 string toRFC822DateTimeString(SysTime systime)
30 {
31 	Appender!string ret;
32 	
33 	DateTime dt = cast(DateTime)systime;
34 	Date date = dt.date;
35 	
36 	ret.put(to!string(date.dayOfWeek).capitalize);
37 	ret.put(", ");
38 	ret.put(rightJustify(to!string(date.day), 2, '0'));
39 	ret.put(" ");
40 	ret.put(to!string(date.month).capitalize);
41 	ret.put(" ");
42 	ret.put(to!string(date.year));
43 	ret.put(" ");
44 	
45 	TimeOfDay time = cast(TimeOfDay)systime;
46 	int tz_offset = cast(int)systime.utcOffset.total!"minutes";
47 	
48 	ret.put(rightJustify(to!string(time.hour), 2, '0'));
49 	ret.put(":");
50 	ret.put(rightJustify(to!string(time.minute), 2, '0'));
51 	ret.put(":");
52 	ret.put(rightJustify(to!string(time.second), 2, '0'));
53 	
54 	if (tz_offset == 0)
55 	{
56 		ret.put(" GMT");
57 	}
58 	else
59 	{
60 		ret.put(" " ~ (tz_offset >= 0 ? "+" : "-"));
61 		
62 		if (tz_offset < 0) tz_offset = -tz_offset;
63 		ret.put(rightJustify(to!string(tz_offset / 60), 2, '0'));
64 		ret.put(rightJustify(to!string(tz_offset % 60), 2, '0'));
65 	}
66 	
67 	return ret.data;
68 }
69 	
70 ///mime types
71 enum MimeTypes = [
72 	".ez" : "application/andrew-inset", 
73 	".hqx" : "application/mac-binhex40", 
74 	".cpt" : "application/mac-compactpro", 
75 	".doc" : "application/msword", 
76 	".bin" : "application/octet-stream", 
77 	".dms" : "application/octet-stream", 
78 	".lha" : "application/octet-stream", 
79 	".lzh" : "application/octet-stream", 
80 	".exe" : "application/octet-stream", 
81 	".class" : "application/octet-stream", 
82 	".so" : "application/octet-stream", 
83 	".dll" : "application/octet-stream", 
84 	".oda" : "application/oda", 
85 	".pdf" : "application/pdf", 
86 	".ai" : "application/postscript", 
87 	".eps" : "application/postscript", 
88 	".ps" : "application/postscript", 
89 	".smi" : "application/smil", 
90 	".smil" : "application/smil", 
91 	".wbxml" : "application/vnd.wap.wbxml", 
92 	".wmlc" : "application/vnd.wap.wmlc", 
93 	".wmlsc" : "application/vnd.wap.wmlscriptc", 
94 	".bcpio" : "application/x-bcpio", 
95 	".vcd" : "application/x-cdlink", 
96 	".pgn" : "application/x-chess-pgn", 
97 	".cpio" : "application/x-cpio", 
98 	".csh" : "application/x-csh", 
99 	".dcr" : "application/x-director", 
100 	".dir" : "application/x-director", 
101 	".dxr" : "application/x-director", 
102 	".dvi" : "application/x-dvi", 
103 	".spl" : "application/x-futuresplash", 
104 	".gtar" : "application/x-gtar", 
105 	".hdf" : "application/x-hdf", 
106 	".js" : "application/x-javascript", 
107 	".skp" : "application/x-koan", 
108 	".skd" : "application/x-koan", 
109 	".skt" : "application/x-koan", 
110 	".skm" : "application/x-koan", 
111 	".latex" : "application/x-latex", 
112 	".nc" : "application/x-netcdf", 
113 	".cdf" : "application/x-netcdf", 
114 	".sh" : "application/x-sh", 
115 	".shar" : "application/x-shar", 
116 	".swf" : "application/x-shockwave-flash", 
117 	".sit" : "application/x-stuffit", 
118 	".sv4cpio" : "application/x-sv4cpio", 
119 	".sv4crc" : "application/x-sv4crc", 
120 	".tar" : "application/x-tar", 
121 	".tcl" : "application/x-tcl", 
122 	".tex" : "application/x-tex", 
123 	".texinfo" : "application/x-texinfo", 
124 	".texi" : "application/x-texinfo", 
125 	".t" : "application/x-troff", 
126 	".tr" : "application/x-troff", 
127 	".roff" : "application/x-troff", 
128 	".man" : "application/x-troff-man", 
129 	".me" : "application/x-troff-me", 
130 	".ms" : "application/x-troff-ms", 
131 	".ustar" : "application/x-ustar", 
132 	".src" : "application/x-wais-source", 
133 	".xhtml" : "application/xhtml+xml", 
134 	".xht" : "application/xhtml+xml", 
135 	".zip" : "application/zip", 
136 	".au" : "audio/basic", 
137 	".snd" : "audio/basic", 
138 	".mid" : "audio/midi", 
139 	".midi" : "audio/midi", 
140 	".kar" : "audio/midi", 
141 	".mpga" : "audio/mpeg", 
142 	".mp2" : "audio/mpeg", 
143 	".mp3" : "audio/mpeg", 
144 	".aif" : "audio/x-aiff", 
145 	".aiff" : "audio/x-aiff", 
146 	".aifc" : "audio/x-aiff", 
147 	".m3u" : "audio/x-mpegurl", 
148 	".ram" : "audio/x-pn-realaudio", 
149 	".rm" : "audio/x-pn-realaudio", 
150 	".rpm" : "audio/x-pn-realaudio-plugin", 
151 	".ra" : "audio/x-realaudio", 
152 	".wav" : "audio/x-wav", 
153 	".pdb" : "chemical/x-pdb", 
154 	".xyz" : "chemical/x-xyz", 
155 	".bmp" : "image/bmp", 
156 	".gif" : "image/gif", 
157 	".ief" : "image/ief", 
158 	".jpeg" : "image/jpeg", 
159 	".jpg" : "image/jpeg", 
160 	".jpe" : "image/jpeg", 
161 	".png" : "image/png", 
162 	".tiff" : "image/tiff", 
163 	".tif" : "image/tif", 
164 	".djvu" : "image/vnd.djvu", 
165 	".djv" : "image/vnd.djvu", 
166 	".wbmp" : "image/vnd.wap.wbmp", 
167 	".ras" : "image/x-cmu-raster", 
168 	".pnm" : "image/x-portable-anymap", 
169 	".pbm" : "image/x-portable-bitmap", 
170 	".pgm" : "image/x-portable-graymap", 
171 	".ppm" : "image/x-portable-pixmap", 
172 	".rgb" : "image/x-rgb", 
173 	".xbm" : "image/x-xbitmap", 
174 	".xpm" : "image/x-xpixmap", 
175 	".xwd" : "image/x-windowdump", 
176 	".igs" : "model/iges", 
177 	".iges" : "model/iges", 
178 	".msh" : "model/mesh", 
179 	".mesh" : "model/mesh", 
180 	".silo" : "model/mesh", 
181 	".wrl" : "model/vrml", 
182 	".vrml" : "model/vrml", 
183 	".css" : "text/css", 
184 	".html" : "text/html", 
185 	".htm" : "text/html", 
186 	".asc" : "text/plain", 
187 	".txt" : "text/plain", 
188 	".rtx" : "text/richtext", 
189 	".rtf" : "text/rtf", 
190 	".sgml" : "text/sgml", 
191 	".sgm" : "text/sgml", 
192 	".tsv" : "text/tab-seperated-values", 
193 	".wml" : "text/vnd.wap.wml", 
194 	".wmls" : "text/vnd.wap.wmlscript", 
195 	".etx" : "text/x-setext", 
196 	".xml" : "text/xml", 
197 	".xsl" : "text/xml", 
198 	".mpeg" : "video/mpeg", 
199 	".mpg" : "video/mpeg", 
200 	".mpe" : "video/mpeg", 
201 	".qt" : "video/quicktime", 
202 	".mov" : "video/quicktime", 
203 	".mxu" : "video/vnd.mpegurl", 
204 	".avi" : "video/x-msvideo", 
205 	".movie" : "video/x-sgi-movie", 
206 	".ice" : "x-conference-xcooltalk" 
207 ];
208 
209 ///get mime content type by extension
210 string mimeContentType(string ext)
211 {
212 	return MimeTypes.get(ext, "application/octet-stream");
213 }
214 
215 /// get mime content type by filename
216 string getMimeContentTypeForFile(string filename)
217 {
218 	string ext = extension(filename);
219 
220 	return mimeContentType(ext);
221 }
222 
223 /// merge multiple strings into a long string
224 string mergeString(string[] params)
225 {
226 	Appender!string ret;
227 	
228 	foreach(str; params)
229 	{
230 		ret.put(str);
231 	}
232 	
233 	return ret.data;
234 }